#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/5/5 20:28
# @Author : 侯建军
# @Site : huoniu8.com
# @File : BikeImportant.py
# @Software: PyCharm
# 数据地址：https://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset

import numpy as np
import pandas as pd
import seaborn as sn
import matplotlib.pyplot as plt

# 1.加载数据
hour_df  = pd.read_csv('../data/bike/hour.csv', header=0)
print('数据集的形状:{}'.format(hour_df.shape))
# 检查是不是有缺失值
hour_df.info()
# 显示头表及数据类型
hour_df.head()

# 2. 设置seaborn参数
params = {
    'legend.fontsize': 'x-large',
    'figure.figsize': (15, 8),     # 设置seaborn大小
    'axes.labelsize': 'x-large',
    'axes.titlesize':'x-large',
    'xtick.labelsize':'x-large',
    'ytick.labelsize':'x-large',
    'font.sans-serif':'SimHei',     # 显示中文
    'axes.unicode_minus':False
}

sn.set_style('whitegrid')
sn.set_context('talk')
plt.rcParams.update(params)         # 使用我们的参数生效
pd.options.display.max_colwidth = 600
print('数据集形状:{}'.format(hour_df.shape))

# 自定义数据字段
hour_df.rename(columns={'instant':'rec_id',
                      'dteday':'datetime',
                      'holiday':'is_holiday',
                      'workingday':'is_workingday',
                      'weathersit':'weather_condition',
                      'hum':'humidity',
                      'mnth':'month',
                      'cnt':'total_count',
                      'hr':'hour',
                      'yr':'year'},
                      # inplace=True：不创建新的对象，直接对原始对象进行修改；
                      # inplace=False：对数据进行修改，创建并返回新的对象承载其修改结果。
                      inplace=True)

# 对日期类型转换
hour_df['datetime'] = pd.to_datetime(hour_df.datetime)
hour_df.info()

# 枚举类型category类别属性
hour_df['season'] = hour_df.season.astype('category')
hour_df['is_holiday'] = hour_df.is_holiday.astype('category')
hour_df['weekday'] = hour_df.weekday.astype('category')
hour_df['weather_condition'] = hour_df.weather_condition.astype('category')
hour_df['is_workingday'] = hour_df.is_workingday.astype('category')
hour_df['month'] = hour_df.month.astype('category')
hour_df['year'] = hour_df.year.astype('category')
hour_df['hour'] = hour_df.hour.astype('category')

# 查看数据信息
hour_df.info()

# 1. 按小时变化趋势
# fig, ax = plt.subplots()
# sn.pointplot(data=hour_df[['hour',
#                           'total_count',
#                           'season']],
#                           x='hour',
#                           y='total_count',
#                           hue='season',
#                           ax=ax)
# ax.set(title='分季节按小时需求量')
# plt.xlabel('小时')
# plt.ylabel('总需求量')

# 发现：
# 不同季节整体趋势差不多
# 高峰期在上午7-9点，下午4-6点（上下班高峰）
# 春季需求量最小，秋季需求量最大
# 逻辑上，工作日和周末的需求量的分布应该不太一样：

# 2. 一周内按小时趋势
# fig, ax = plt.subplots()
# sn.pointplot(data=hour_df[['hour','total_count','weekday']],
#             x='hour',y='total_count',hue='weekday',ax=ax)
# ax.set(title='周內按小时需求量')
# plt.show()

# >发现
# 周末午后需求量较高，工作日早晚需求量较大
# 工作日的需求量曲线和整体相近
# 相较于周末，工作日整体需求量更大
# 如果我们分注册用户和非注册用户看，可能也会有有趣的发现


# 3. 按月来看看需求量

# fig,ax = plt.subplots()
# sn.barplot(data=hour_df[['month',
#                          'total_count']],
#            x="month",y="total_count")
# ax.set(title="月度需求量")
# plt.show()

# >发现
# 看起来6月到9月是需求量最旺盛的时候，这个时候正好是秋季，秋高气爽适合骑行。
# 这跟前面的秋季需求量大是吻合的。

# 4. 年度的数据情况。0表示2011年，1表示2012年。
# sn.violinplot(data=hour_df[['year',
#                             'total_count']],
#              x='year', y='total_count')
# plt.show()

# >发现：
# 两个年份均是多峰分布
# 2011年总体而言相较2012，需求量低，且需求量中位数较低
# 2012年最大需求量更高

# * 5.节假日影响
# fig,(ax1,ax2) = plt.subplots(ncols=2)
# sn.barplot(data=hour_df,x='is_holiday',y='total_count',hue='season',ax=ax1)
# sn.barplot(data=hour_df,x='is_workingday',y='total_count',hue='season',ax=ax2)
# plt.show()

# >发现：
# 工作日需求量更加稳定
# 夏秋季需求量均值差不多；但春、冬季工作日需求量显然高于假日

# 6. 极值点
# fig,(ax1,ax2)= plt.subplots(ncols=2)
# sn.boxplot(data=hour_df[['total_count',
#                          'casual','registered']],ax=ax1)
# sn.boxplot(data=hour_df[['temp','windspeed']],ax=ax2)
# plt.show()

# fig,ax = plt.subplots()
# sn.boxplot(data=hour_df[['hour','total_count']],x="hour",y="total_count",ax=ax)
# ax.set(title=u"按小时需求量箱型图")
# plt.show()

corrMatt = hour_df[["temp","atemp",
                    "humidity","windspeed",
                    "casual","registered",
                    "total_count"]].corr()
mask = np.array(corrMatt)
mask[np.tril_indices_from(mask)] = False
sn.heatmap(corrMatt, mask=mask,
           vmax=.8, square=True,annot=True)
plt.show()